package com.gec.system.util;

import io.jsonwebtoken.*;
import org.springframework.util.StringUtils;

import java.util.Date;


/**
 * @author  gec
 * @since  2024/03/12
 *
 *
 *   生成JSON Web令牌的工具类
 */
public class JwtHelper {

    //token过期时间
    private static final long tokenExpiration = 365 * 24 * 60 * 60 * 1000;
    //加密秘钥
    private static final String tokenSignKey = "123456";

    //根据用户id和用户名称生成token字符串

    /**
     * 创建JWT令牌
     *
     * @param userId 用户ID
     * @param username 用户名
     * @return 加密后的JWT令牌
     *
     * 方法说明：
     * <p>- setSubject(): 设置JWT所面向的用户（只是一个标识）
     * <p>- setExpiration(): 设置JWT的过期时间，必须大于签发时间
     * <p>- claim(): 添加有效载荷，不要存放敏感信息（如密码）
     * <p>- signWith(): 使用指定的签名算法和密钥进行签名，防止数据篡改
     * <p>- compressWith(): 对JWT进行压缩处理，使其一行显示
     * <p>- compact(): 将各部分拼接成完整的JWT令牌
     */
    public static String createToken(String userId, String username) {
        return Jwts.builder()
                .setSubject("DAFEI-USER")
                .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
                .claim("userId", userId)
                .claim("username", username)
                .signWith(SignatureAlgorithm.HS512, tokenSignKey)
                .compressWith(CompressionCodecs.GZIP)
                .compact();
    }


    //从token字符串获取userid

    /**
     * 根据给定的加密Token字符串，解析并返回用户ID。
     *
     * @param token 加密后的Token字符串，包含用户信息
     * @return 解析出的用户ID；如果无法解析或Token为空，返回null
     *
     * 解析过程：
     * <p>1. 使用 StringUtils.isEmpty(token) 检查Token是否为空；
     * <p>2. 如果不为空，调用 Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token) 使用预定义的密钥解析Token；
     * <p>3. 使用 claimsJws.getBody() 获取Token的载荷（Claims部分），即Token中携带的信息；
     * <p>4. 从载荷中提取 "userId" 字段，返回用户ID。
     */
    public static String getUserId(String token) {
        try {
            if (StringUtils.isEmpty(token)) {
                return null;
            }
            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
            Claims claims = claimsJws.getBody();

            String userId = claims.get("userId", String.class);
            return userId;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 根据给定的加密Token字符串，解析并返回用户名。
     *
     * @param token 加密后的Token字符串，包含用户名等用户信息
     * @return 解析出的用户名；如果Token为空或解析失败，返回空字符串
     *
     * 解析过程：
     * <p>1. 使用 StringUtils.isEmpty(token) 检查Token是否为空；
     * <p>2. 如果不为空，调用 Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token) 使用预定义的密钥解析Token；
     * <p>3. 使用 claimsJws.getBody() 获取Token的载荷（Claims部分），即Token中携带的信息；
     * <p>4. 从载荷中提取 "username" 字段，返回解析出的用户名。
     */
    public static String getUsername(String token) {
        try {
            if (StringUtils.isEmpty(token)) {
                return "";
            }
            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
            Claims claims = claimsJws.getBody();
            return (String) claims.get("username");
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }



}